package hopfield;

import static hopfield.Configuracion.*;
import static hopfield.util.Matriz.*;

public class Hopfield {

	public static void main(String[] args) {
		// cargarPatrones
		int cantNeuronas = CANT_FILAS * CANT_COLUMNAS;
		int[][] patrones = new int[CANT_PATRONES][cantNeuronas];

		/*
		 * aprendisaje hopfield . matriz de identidad N*N . matriz de pesos por
		 * patron [w = sum(te[] * mPatrones - i[])] te:matriz transpuesta de un
		 * patron mPatrones:matriz de patrones i:matriz de identidad
		 */
		// releaseIdentidades
		int[][] identidades = new int[cantNeuronas][cantNeuronas];
		for (int i = 0; i < CANT_FILAS - 1; i++) {
			for (int j = 0; j < CANT_COLUMNAS; j++) {
				identidades[i][j] = (i == j ? 1 : 0);
			}
		}
		int[][] opuesta = opuesta(identidades);

		// releasePesos
		int[][] pesos = new int[cantNeuronas][cantNeuronas];
		for (int i = 0; i < CANT_FILAS - 1; i++) {
			int[][] patron = new int[1][cantNeuronas];
			for (int j = 0; j < CANT_COLUMNAS; j++) {
				int[][] transpuesta = traspuesta(patron, CANT_FILAS, CANT_COLUMNAS);
				int[][] producto = producto(transpuesta, patron);
				pesos = suma(pesos, suma(producto,opuesta));
			}
		}
		
		// procesar producto(entrada,pesos) > normalizar
		int[][] entrada = new int[1][cantNeuronas];
		int[][] salida = producto(entrada, pesos);
		for (int i = 0; i < CANT_FILAS; i++) {
			for (int j = 0; j < CANT_COLUMNAS; j++) {
				salida[i][j] = (salida[i][j] > 0? 1: 0);
			}
		}
		
		// comparacion de salidas en t y t+1
		for (int j = 0; j < CANT_COLUMNAS; j++) {
			if (salida[0][j] < 0) {
				sonIguales(entrada, salida);
			}
		}
	}
}
